<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>

    <script>
        // function fn() {
        //     console.log(this)
        // }

        // fn() //全局作用下


        // let o = {
        //     fn: function() {
        //         console.log(this)
        //     }
        // }

        // o.fn() //在对象

        //1.在哪里调用函数，this就指向谁；

        // var person = {
        //     name: '张三',
        //     describe: function() {
        //         return '姓名：' + this.name;
        //     }
        // };

        // person.describe() // "姓名：张三"

        //////////////////////////////////////
        // var A = {
        //     name: '张三',
        //     describe: function() {
        //         return '姓名：' + this.name;
        //     }
        // };

        // var B = {
        //     name: '李四'
        // };

        // B.describe = A.describe;
        // B.describe() // "姓名：李四"
        /////////////////////////////////////
        // function f() {
        //     return '姓名：' + this.name;
        // }

        // var A = {
        //     name: '张三',
        //     describe: f
        // };

        // var B = {
        //     name: '李四',
        //     describe: f
        // };

        // A.describe() // "姓名：张三"
        // B.describe() // "姓名：李四"

        ///////////////////////////////

        //2.this 改变 动态
        // var A = {
        //     name: '张三',
        //     describe: function() {
        //         return '姓名：' + this.name;
        //     }
        // };

        // var name = '李四';
        // var f = A.describe;
        // f() // "姓名：李四"


        //////////////////////////////////////
        //window对象
        //构造函数的this指向，指向的是实例化对象
        // function Dog(name) {
        //     this.name = name;
        // }
        // var dog1 = new Dog("阿赫");
        // var dog2 = new Dog("阿黄");
        // console.log(dog1, dog2)

        //谁调用，我指向谁
        // var a = {
        //     p: 'Hello',
        //     b: {
        //         m: function() {
        //             console.log(this.p);
        //         }
        //     }
        // };

        // a.b.m()


        // var b = {
        //     m: function() {
        //         console.log(this.p);
        //     }
        // };

        // var a = {
        //     p: 'Hello',
        //     b: b
        // };

        // (a.b).m()

        // var length = 10;

        // function fn() {
        //     console.log(this.length);
        // }

        // var obj = {
        //     length: 5,
        //     method: function(fn) {
        //         fn();
        //         arguments[0]();
        //     }
        // };

        // obj.method(fn, 1);

        //谁调用，指向谁
        // var o = {
        //     p: "hello",
        //     f1: function() {
        //         var that = this;
        //         var f2 = function() {
        //             console.log(that.p);
        //         }();
        //     }
        // }
        // o.f1()



        // 匿名自执行函数   只执行一次
        // (function() {
        //     console.log(1)
        // }())

        // (function() {
        //     console.log(2)
        // })()

        // + function() {
        //     console.log(3)
        // }()

        // ! function() {
        //     console.log(4)
        // }()
        // ~ function() {
        //     console.log(5)
        // }()



        ///////////////////////////////////////
        // var o = {
        //     v: 'hello',
        //     p: ['a1', 'a2'],
        //     f: function f() {
        //         this.p.forEach(function(item) {
        //             console.log(this.v + ' ' + item);
        //         },this);
        //     }
        // }
        // o.f();


        // [1, 2, 3].forEach(function() { //回调函数
        //     console.log(this) //数组方法函数作为参数 this=》window
        // });


        // (function() {
        //     var a = b = 20
        // })()
        // console.log(b)//20
        // console.log(a)//




        // function getSum(n) {
        //     var index = 5;
        //     if (typeof(n) === "number") {
        //         index = n;
        //     } else {
        //         index = index + n * 1;
        //     }
        //     console.log(index);
        // }
        // getSum("+1");

        // (function() {
        //     console.log(a);
        //     console.log(b);
        //     var a = b = 10;
        // })();
    </script>
</body>

</html>